home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / Papers / C++ Exceptions / µShell / Array Classes / (Hidden) / LinkedListIterator.cp < prev    next >
Encoding:
Text File  |  1996-01-13  |  2.8 KB  |  142 lines  |  [TEXT/CWIE]

  1. /*
  2.     File:        LinkedListIterator.cp
  3.  
  4.     Contains:    stuff
  5.  
  6. */
  7.  
  8. #include "LinkedListIterator.h"
  9. #include "LinkedList.h"
  10. #include "ListLink.h"
  11.  
  12.  
  13. LinkedListIterator::LinkedListIterator(LinkedList& list, ListLink* start)
  14.   : fList(list),
  15.     fCurrentLink(start),
  16.     fNextIterator(list.fIteratorList)
  17. {
  18.     list.fIteratorList = this;
  19. }
  20.  
  21. //--------------------------------------------------------------------------------
  22. LinkedListIterator::~LinkedListIterator()
  23. {
  24.     LinkedListIterator* iter = fList.fIteratorList;
  25.     
  26.     if (iter == this)            // special case if we're first (very likely)
  27.     {
  28.         fList.fIteratorList = fNextIterator;
  29.     }
  30.     else while (iter != nil)    // look through the chain
  31.     {
  32.         LinkedListIterator* prev = iter;
  33.         iter = iter->fNextIterator;
  34.         
  35.         if (iter == this)
  36.         {
  37.             prev->fNextIterator = iter->fNextIterator;
  38.             break;
  39.         }
  40.     }
  41. }
  42.  
  43.  
  44. //--------------------------------------------------------------------------------
  45. Boolean LinkedListIterator::MoreBefore()
  46. {
  47.     return fCurrentLink && fCurrentLink->GetPrevLink();
  48. }
  49.  
  50.  
  51. //--------------------------------------------------------------------------------
  52. Boolean LinkedListIterator::MoreAfter()
  53. {
  54.     return fCurrentLink && fCurrentLink->GetNextLink();
  55. }
  56.  
  57.  
  58. //--------------------------------------------------------------------------------
  59. ListLink* LinkedListIterator::FirstLink()
  60. {
  61.     ListLink* link = fList.GetFirstLink();
  62.     
  63.     fCurrentLink    = link;
  64.  
  65.     return link;
  66. }
  67.  
  68.  
  69. //--------------------------------------------------------------------------------
  70. ListLink* LinkedListIterator::LastLink()
  71. {
  72.     ListLink* link = fList.GetLastLink();
  73.     
  74.     fCurrentLink = link;
  75.  
  76.     return link;
  77. }
  78.  
  79.  
  80. //--------------------------------------------------------------------------------
  81. ListLink* LinkedListIterator::NextLink()
  82. {
  83.     ListLink* link = fCurrentLink;
  84.     
  85.     if (link)
  86.         link = link->GetNextLink();
  87.     
  88.     fCurrentLink = link;
  89.     
  90.     return link;
  91. }
  92.  
  93.  
  94. //--------------------------------------------------------------------------------
  95. ListLink* LinkedListIterator::PrevLink()
  96. {
  97.     ListLink* link = fCurrentLink;
  98.     
  99.     if (link)
  100.         link = link->GetPrevLink();
  101.     
  102.     fCurrentLink = link;
  103.  
  104.     return link;
  105. }
  106.  
  107.  
  108. //--------------------------------------------------------------------------------
  109. void LinkedListIterator::LinkInserted(ListLink& link)
  110. {
  111.     if (fNextIterator)
  112.         fNextIterator->LinkInserted(link);
  113. }
  114.  
  115.  
  116. //--------------------------------------------------------------------------------
  117. void LinkedListIterator::RemovingLink(ListLink& link)
  118. {
  119.     // If the current link is about to be deleted, make sure we don't
  120.     // have a dangling pointer lying around
  121.     
  122.     if (&link == fCurrentLink)
  123.     {
  124.         fCurrentLink = nil;
  125.     }
  126.  
  127.     if (fNextIterator)
  128.         fNextIterator->RemovingLink(link);
  129. }
  130.  
  131.  
  132. //--------------------------------------------------------------------------------
  133. void LinkedListIterator::RemovingAllLinks()
  134. {
  135.     fCurrentLink = nil;
  136.  
  137.     if (fNextIterator)
  138.         fNextIterator->RemovingAllLinks();
  139. }
  140.  
  141.  
  142.